import torch
obj=''
d='float32'
device='cuda'
'''
tensor api手册
'''
#tensors
torch.is_tensor(obj)#检测obj是否为torch张量
torch.is_storage(obj)#检查obj是否为pytoch储存对象
torch.is_complex(input)#检查input类型是否为复数类型
torch.is_conj(input)#检查input是否为共轭张量
torch.is_floating_point(input)#检查input数据类型是否为浮点数据类型
torch.is_nonzero(input)#检查input是否为非零单一元素张量
torch.set_default_dtype(d)#设置默认浮点数据类型为d
torch.set_default_device(device)#分支分配的设备
torch.get_default_device()#获取默认的torch.tensor分配的设备
torch.numel(input)#返回input张量中的元素总数

#creation ops
torch.tensor(data)#通过复制data构造无自动梯度历史的张量
torch.sparse_coo_tensor(indices,values)#在指定的indices出构造系数张量，具有指定的值
torch.as_tensor(data)#将data转换为张量，共享数据并经可能保留自动梯度历史。
torch.zeros(size)#返回用一个标量值0填充的张量，形状由size定义
torch.ones(size)#返回用一个用标量值1填充的张量，形状有size定义
torch.arange(start,end,step)#返回一个1-D张量，包含从start到end的值，步长为step
torch.rand(size)#返回一个从[0,1)区分均匀分布的随机数填充的张量
torch.randn(size)#返回一个从标准正太分布填充的张量

#math operations
torch.add(input,other,alpha) #将other(有alpha缩放)加到input上
torch.mul(input,other)#将input与other相乘
torch.matmul(input,other)#执行input和other的矩阵算法
torch.mean(input,dim)#计算input在维度dim上的均值。
torch.sum(input,dim)#计算input在维度dim上的和
torch.max(input,dim)#返回input在维度dim上的最大值
torch.min(input,dim)#返回input在维度dim上的最小值

'''
tensor创建
'''
torch.tensor(data,dtype,device,require_grad)#从数据创建张量
torch.as_tensor(data,dtype,device)#从数据转化为张量（共享内存）
torch.from_numpy(ndarray)#从numpy数组创建张量
torch.zeros(*size,dtype,device,requires_grad)#创建全零张量
torch.ones(*size,dtype,device,requires_grad)#创建全一张量
torch.empty(*size,dtype,device,requires_grad)#创建未初始化的张量
torch.arange(start,end,steps,dtype,devices,requires_grad)#创建等差序列张量
torch.linspace(start,end,steps,dtype,device,requires_grad)#创建等间隔序列张量
torch.logspace(start,end,steps,dtype,device,requires_grad)#船舰对数间隔序列张量
torch.eye(n,m,dtype,device,requires_grad)#创建单位矩阵
torch.full(size,fill_value,dtype,device ,requires_grad)#创建填充指定值的张量
torch.rand(*size,dtype,device,requires_grad)#创建均匀分布的随机张量
torch.randn(*size,dtype,device,requires_grad)#创建标准正态分布随即张量
torch.randint(low,high,size,dtype,device,requires_grad)#创建证书随机张量
torch.randperm(n,dtype,device,requires_grad)#创建0到n-1的随机排列

'''
Tensor操作
'''
torch.cat(tensors,dim)#眼指定维度连接张量
torch.stack(tnesors,dim)#沿新维度堆叠张量
torch.split(tensor,split_size,dim)#将张量沿指定维度分割
torch.chunk(tensor,chunks,dim)#将张量眼指定维度分块
torch.reshape(input,shape)#改变张量的形状
torch.transpose(input,dim0,dim1)#交换张量的两个维度
torch.squeeze(input,dim)#移除大小为1的维度
torch.unsqueeze(input,dim)#在指定位置插入大小为1的维度
torch.expand(input,size)#扩张张量的尺寸
torch.narrow(input,dim,start,length)#返回张量的切片
torch.permute(input,dims)#重新排列张量的维度
torch.masked_select(input,mask)#根据布尔掩码选择元素
torch.index_select(input,dim,index)#眼指定维度选择索引对应的元素
torch.gather(input,dim,index)#沿指定维度搜集指定索引的元素
torch.scatter(input,dim,index,src)#将src的值散布到input的指定位置
torch.nonzero(input)#返回非零元素的所索引

"""
数学运算
"""
torch.add(input,other)#逐个元素做加法
torch.sub(input,other)#逐个元素做减法
torch.mul(input,other)#逐元素乘法
torch.div(input,other)#逐个元素除法
torch.matmul(input,other)#矩阵乘法
torch.pow(input,exponent)#逐元素幂运算
torch.sqrt(input)#逐元素平方根
torch.exp(input)#逐元素指数函数
torch.log(input)#逐元素自然对数
torch.sum(input,dim)#沿指定维度求和
torch.mean(input,dim)#沿指定维度求均值
torch.max(input,dim)#沿指定维度求最大值
torch.min(input,dim)#沿指定维度求最小值
torch.abs(input)#逐元素绝对值
torch.clamp(input,min,max)#将张量值限制再指定范围内
torch.round(input)#逐元素四舍五入
torch.floor(input)#逐元素向下取整
torch.ceil(input)#逐元素向上取整

"""
随机数生成
"""
torch.manual_seed(seed)#设置随机种子
torch.initial_seed()#返回当前随机种子
torch.rand(*size)#创建均匀分布随即张量（范围【0，1】）
torch.randn(*size )#创建标准正态分布随机张量
torch.randint(low,high,size)#创建整数随机张量
torch.randperm(n)#返回0到n-1的随机排列

"""
线性代数
"""
torch.dot(input,other)#计算两个向量的点积
torch.mm(input,mat2)#矩阵乘法
torch.bmm(input,mat2)#批量矩阵乘法
torch.eig(input)#计算举证的特征值和特征向量
torch.svd(input)#计算矩阵的奇异值分解
torch.det(input)#计算矩阵的行列式
torch.trace(input)#计算矩阵的迹

"""
设备管理
"""
torch.cuda.is_available()
torch.device()#创建一个设备对象
torch.to(device)#将张量移动到指定设备

"""
实例
"""
import torch
#创建张量
x=torch.tensor([1,2,3])
y=torch.tensor(2,3)

#数学运算
z=torch.add(x,1)#逐元素加1
print(z)

#索引和切片
mask=x>1
selected=torch.masked_select(x,mask)
print(selected)

#设备管理
if torch.cuda.is_available():
    device=torch.device('cuda')
    x=x.to(device)
    print(x.device)






torch.split(tensor,split_size,dim)#将张量沿指定维度分割








torch.chunk(tensor,chunks,dim)#将张量沿指定维度分块
torch.reshape(input,shape)#改变张量的形状
torch.transpose(input,dim0,dim1)#交换张量的两个维度
torch.squeeze(input,dim)#移除大小为1的维度


